// src/utils/request.js
import axios from 'axios'
import apiConfig from './apiConfig'

// 创建 axios 实例
const request = axios.create({
  baseURL: apiConfig.baseURL.current, // 使用相对路径
  timeout: apiConfig.timeout,
  headers: apiConfig.headers
})

// 请求拦截器
request.interceptors.request.use(
  config => {
    console.log('🚀 发起请求:', config.url)
    // 从 localStorage 或其他地方获取 token
    const token = localStorage.getItem('ACCESS_TOKEN')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    console.error('❌ 请求拦截失败:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  response => {
    console.log('✅ 响应成功:', response.config.url)
    return response.data // 返回 data 字段，避免重复处理
  },
  error => {
    const { response, code } = error

    if (code === 'ECONNABORTED') {
      console.warn('⚠️ 请求超时，正在重试...')
      return handleRetry(error)
    }

    if (response) {
      console.error('❌ 响应错误:', response.status, response.data)
      // 根据状态码做不同处理
      switch (response.status) {
        case 401:
          // 未登录，跳转到登录页
          window.location.href = '/login'
          break
        case 403:
          // 登录过期或无权限访问
          // 清除本地token
          localStorage.removeItem('ACCESS_TOKEN')
          // 跳转到登录页
          window.location.href = '/login'
          break
        case 404:
          // 资源不存在
          alert('请求的资源不存在')
          break
        case 500:
          // 服务器错误
          alert('服务器内部错误，请稍后重试')
          break
      }
    } else {
      console.error('❌ 网络错误:', error.message)
      alert('网络连接失败，请检查网络设置')
    }

    return Promise.reject(error)
  }
)

// 重试逻辑
function handleRetry(error) {
  const maxRetries = 2
  let retryCount = 0

  const retry = () => {
    retryCount++
    if (retryCount > maxRetries) {
      console.error('❌ 重试次数已达上限，放弃请求')
      return Promise.reject(error)
    }

    console.log(`🔄 第 ${retryCount} 次重试...`)
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        try {
          const config = error.config
          // 重新发起请求
          axios(config).then(resolve).catch(reject)
        } catch (err) {
          reject(err)
        }
      }, 1000 * retryCount) // 指数退避
    })
  }

  return retry()
}

export default request